﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PraceDyplomowe2.Models;

namespace PraceDyplomowe2.Controllers
{
    public class TematyController : Controller
    {
        private PraceDyplomoweEntities db = new PraceDyplomoweEntities();

		//todo: co to jest?
        public static int GetUserId(HttpContextBase context)
        {
            var User = new UserProfile ();
            User.UserId = GetUserId(context);
            return User.UserId;
        }
        //
        // GET: /Tematy/


        public ActionResult Index(int userId = 0)
        {
	        IEnumerable<Temat> tematy;
			if(userId == 0)
			{
				if (User.IsInRole(Rola.StudentNazwa))
					tematy = db.Tematy.Where(t => t.StatusPromotor.Nazwa != StatusPromotor.NowyNazwa);
				else
					tematy = db.Tematy;
			}
			else
			{
				if (User.IsInRole(Rola.StudentNazwa))
					tematy = db.Tematy
						.Where(t => t.StatusPromotor.Nazwa != StatusPromotor.NowyNazwa)
						.Where(t => t.Promotor.UserId == userId);
				else
					tematy = db.Tematy.Where(t => t.Promotor.UserId == userId); ;
			}

	        var listaTematowViewModel = new ListaTematowViewModel
		        {
			        Tematy = tematy.ToList(),
			        KierunkiStudiow = db.KierunkiStudiow,
			        PoziomyStudiow = db.PoziomyStudiow
		        };

	        return View(listaTematowViewModel);
        }

        //
        // GET: /Tematy/Details/5

        public ActionResult Details(int id = 0)
        {
            Temat temat = db.Tematy.Find(id);
            if (temat == null)
            {
                return HttpNotFound();
            }

	        var tematViewModel = AutoMapper.Mapper.DynamicMap<TematViewModel>(temat);

	        tematViewModel.Promotor = string.Format("{0} {1}", temat.Promotor.Imie, temat.Promotor.Nazwisko);
	        tematViewModel.ZalogowanyUrzytkownik = db.UserProfiles.Single(up => up.UserName == User.Identity.Name);

	        return View(tematViewModel);
        }

        //
        // GET: /Tematy/Create

		[Authorize(Roles = Rola.PromotorNazwa)]
        public ActionResult Create(int id = 0)
        {
	        if (id == 0)
		        id = db.UserProfiles.First(u => u.UserName == User.Identity.Name).UserId;

	        var temat = new TematViewModel
		        {
			        PromotorUserId = id,
					KierunkiStudiow = db.KierunkiStudiow,
					PoziomyStudiow = db.PoziomyStudiow
		        };

			return View(temat);
        }

	    //
        // POST: /Tematy/Create

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(TematViewModel temat)
        {
            if (ModelState.IsValid)
            {
                var promotor = db.UserProfiles.SingleOrDefault(
					c => c.UserId == temat.PromotorUserId);

                promotor.Tematy.Add(new Temat
	                {
		                AngielskiTytul = temat.AngielskiTytul,
						PolskiTytul = temat.PolskiTytul,
						KierunekStudiow = db.KierunkiStudiow.Find(temat.KierunekStudiowId),
						PoziomStudiow = db.PoziomyStudiow.Find(temat.PoziomStudiowId),
						StatusPromotor = db.StatusyPromotor.Single(s => s.Nazwa == StatusPromotor.NowyNazwa),
						StatusStudent = db.StatusyStudent.Single(s => s.Nazwa == StatusStudent.WolnyNazwa)
                        //DataUtworzenia = System.DateTime.Now
	                });
	            if (temat.PolskiTytul == null)
	            {
		            
	            }

				db.SaveChanges();
	            return RedirectToAction("Index");
            }

	        temat.KierunkiStudiow = db.KierunkiStudiow;
            return View(temat);
        }

        //
        // GET: /Tematy/Edit/5

        public ActionResult Edit(int id = 0)
        {
            Temat temat = db.Tematy.Find(id);

            if (temat == null)
            {
                return HttpNotFound();
            }
            return View(temat);
        }

        //
        // POST: /Tematy/Edit/5

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(Temat temat)
        {
            if (ModelState.IsValid)
            {
                db.Entry(temat).State = EntityState.Modified;
                //temat.DataOstatniejModyfikacji = System.DateTime.Now;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(temat);
        }

        //
        // GET: /Tematy/Delete/5

        public ActionResult Delete(int id = 0)
        {
            Temat temat = db.Tematy.Find(id);
            if (temat == null)
            {
                return HttpNotFound();
            }
            return View(temat);
        }

        //
        // POST: /Tematy/Delete/5

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Temat temat = db.Tematy.Find(id);

            db.Tematy.Remove(temat);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        public ActionResult Found(ListaTematowViewModel viewModel)
        {
	        var tematy = db.Tematy.ToList()
		        .Where(t =>
					t.PoziomStudiow.PoziomStudiowId == viewModel.PoziomStudiowId
					&& t.KierunekStudiow.KierunekStudiowId == viewModel.KierunekStudiowId
					&& ( string.IsNullOrEmpty(viewModel.WyrazenieWyszukiwania)
					|| viewModel.WyrazenieWyszukiwania.Split(' ').Any(s => MatchNameWithoutDiacritics(t.Promotor.Imie, s)
					|| MatchNameWithoutDiacritics(t.Promotor.Nazwisko, s)
					|| t.PolskiTytul.Split(' ').Any(slowoZTytulu => MatchNameWithoutDiacritics(slowoZTytulu, s)))));

	        if (!tematy.Any())
		        return RedirectToAction("NotFound");

	        return View(tematy);
            
        }

		private bool MatchNameWithoutDiacritics(string tekst, string slowo)
		{
			return (tekst.Length >= slowo.Length
				&& string.Compare(
				tekst.Substring(0, slowo.Length),
				slowo,
				CultureInfo.CurrentCulture,
				CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0);
		}

        public ActionResult NotFound()
        {

            return View();
        }


		[HttpPost]
	    public ActionResult ConfirmTemat(int id)
	    {
		    var temat = db.Tematy.Find(id);
		    temat.StatusPromotor = db.StatusyPromotor.Single(sp => sp.Nazwa == StatusPromotor.ZatwierdzonyNazwa);
		    db.SaveChanges();

			return RedirectToAction("Details", new { id });
	    }

		[HttpPost]
	    public ActionResult RejectTemat(int id)
	    {
		    var temat = db.Tematy.Find(id);
			db.Tematy.Remove(temat);
			db.SaveChanges();

			return RedirectToAction("Index");
	    }

	    public ActionResult Assign(int id)
	    {
		    var temat = db.Tematy.Find(id);

		    temat.Student = db.UserProfiles.Single(st => st.UserName == User.Identity.Name);
		    temat.StatusStudent = db.StatusyStudent.Single(ss => ss.Nazwa == StatusStudent.OczekującyNazwa);

		    db.SaveChanges();

		    return RedirectToAction("Details", new {id});
	    }

	    public ActionResult ConfirmStudent(int id)
	    {
			var temat = db.Tematy.Find(id);

			temat.StatusStudent = db.StatusyStudent.Single(st => st.Nazwa == StatusStudent.ZajetyNazwa);
		    db.SaveChanges();

			return RedirectToAction("Details", new { id });
	    }

	    public ActionResult RejectStudent(int id)
		{
			var temat = db.Tematy.Find(id);

			db.Entry(temat).Reference(t => t.Student).Load();
		    temat.Student = null;

		    temat.StatusStudent = db.StatusyStudent.Single(st => st.Nazwa == StatusStudent.WolnyNazwa);

		    db.SaveChanges();

		    return RedirectToAction("Details", new { id });
		}


		//
		// GET: /Tematy/CreateBibliografia

		[Authorize(Roles = "Promotor")]
		public ActionResult CreateBibliografia(int id)
		{
			return View(new BibliografiaViewModel { TematTematId = id });
		}

		//
		// POST: /Tematy/CreatePublikacje

		[HttpPost]
		[ValidateAntiForgeryToken]
		[Authorize(Roles = "Promotor")]
		public ActionResult CreateBibliografia(BibliografiaViewModel viewModel)
		{
			if (ModelState.IsValid)
			{
				var bibliografia = AutoMapper.Mapper.DynamicMap<Bibliografia>(viewModel);

				Temat temat = db.Tematy.Find(viewModel.TematTematId);
				temat.Bibliografie.Add(bibliografia);
				db.SaveChanges();

				return RedirectToAction("Edit", new { id = viewModel.TematTematId });
			}

			//todo: poprawić
			return View(viewModel);

		}

		//
		// GET: /Tematy/EditBibliografia

		[Authorize(Roles = "Promotor")]
		public ActionResult EditBibliografia(int id)
		{
			Bibliografia bibliografia = db.Bibliografie.Find(id);

			var viewModel = AutoMapper.Mapper.DynamicMap<BibliografiaViewModel>(bibliografia);

			return View(viewModel);
		}

		[HttpPost]
		[ValidateAntiForgeryToken]
		[Authorize(Roles = "Promotor")]
		public ActionResult EditBibliografia(BibliografiaViewModel viewModel)
		{
			var bibliografia = db.Bibliografie.Find(viewModel.BibliografiaId);
			AutoMapper.Mapper.DynamicMap(viewModel, bibliografia);

			db.SaveChanges();

			return RedirectToAction("Edit", new { id = viewModel.TematTematId });
		}

		//
		// GET: /ProfilPromotora/DeleteBibliografia

		[Authorize(Roles = "Promotor")]
		public ActionResult DeleteBibliografia(int id)
		{
			Bibliografia bibliografia = db.Bibliografie.Find(id);
			var viewModel = AutoMapper.Mapper.DynamicMap<BibliografiaViewModel>(bibliografia);

			return View(viewModel);
		}

	    //
		// POST: /ProfilPromotora/EditPublikacje

		[HttpPost, ActionName("DeleteBibliografia")]
		[ValidateAntiForgeryToken]
		[Authorize(Roles = "Promotor")]
		public ActionResult DeleteBibliografiaConfirmed(int id)
		{
			var bibliografia = db.Bibliografie.Find(id);
			var tematID = bibliografia.Temat.TematId;
			db.Bibliografie.Remove(bibliografia);
			db.SaveChanges();

			return RedirectToAction("Edit", new { id = tematID });
		}


	    protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}